class Competencia < ActiveRecord::Base
  has_many :preguntas
  has_many :cargos, :through => :competencias_cargos
  has_many :competencias_cargos

  after_update :update_competencias_cargos

  #Validaciones
  validates_presence_of   :titulo
  validates_uniqueness_of :titulo, :scope => :cargo_id

  TIPOS = ["especifica", "general"]

  delegate :nombre, :to => :cargo, :prefix => true, :allow_nil => true
  attr_writer :cargo_nombre

  def titulo_tipo
    "#{self.titulo} - #{self.tipo}"
  end

  def cargo_nombre
    self.cargo.nil? ? "Competencia General" : self.cargo.nombre
  end

  def self.ids_generales
    self.find_all_by_tipo("general").map(&:id)
  end

  def self.ids_especificas
    self.find_all_by_tipo("especifica").map(&:id)
  end

  def peso_por_comportamiento
    peso = []
    self.competencias_cargos.each do |cc|
      cc.descripciones.each do |desc|
        peso << desc.peso
      end
    end
    peso
  end

  def peso_por_competencia
    if tipo == 'general' && !peso_por_comportamiento.compact.empty?
      self.peso_por_comportamiento.sum.round
    else
      nil
    end
  end

  def new_descripcion_attributes=(descripcion_attributes)
    descripcion_attributes.each do |attributes|
      descripciones.build(attributes) unless attributes.values.any?(&:blank?)
    end
  end

  def existing_descripcion_attributes=(descripcion_attributes)
    descripciones.reject(&:new_record?).each do |descripcion|
      attributes = descripcion_attributes[descripcion.id.to_s]
      if attributes
        descripcion.attributes = attributes
      else
        descripciones.destroy(descripcion)
      end
    end
  end

  def save_descripciones
    descripciones.each do |descripcion|
      descripcion.save!
    end
  end

  def descripciones(cargo=nil)
    conditions = cargo.nil? ? ['cargo_id IS NULL'] : ['cargo_id = ?', cargo.id]

    cc = competencias_cargos.find(:all, :conditions => conditions)    
    unless cc.empty?
      cc.map(&:descripciones).flatten
    else
      cc
    end
  end

  private

  def update_competencias_cargos
    if self.tipo == 'general'
      competencias_cargos.update_all(:cargo_id => nil)
    end   
  end

end

